package bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import exception.ExceptionGrupo;


/**
 * Classe que cadastra Perfil de um Usuario
 * @author Claudio Cardoso, Daniel Leite, Lucas Sampaio, Matheus Sampaio
 * @version 1.0
 */


public class Jogador implements Comparable<Jogador>, Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String nome;
	private String data;
	private String naturalidade;
	private String paisQueTorce;
	private String email;
	private String senha;
	private Map<Integer, Integer> pontuacao;
	private List<Grupo> grupos = new ArrayList<Grupo>();
	private String foto;
	
	//construtor
	public Jogador (String nome, String data, String naturalidade, String paisQueTorce, String email, String senha) throws IllegalArgumentException {
		
		if (nome == null || data == null || naturalidade == null || paisQueTorce == null || email == null || senha == null ||
			nome.trim().equals("") ||  data.trim().equals("") || naturalidade.trim().equals("") || paisQueTorce.trim().equals("") || 
			email.trim().equals("") || senha.toString().trim().equals("")){
			
			throw new IllegalArgumentException();
		}
		
		this.nome = nome;
		this.data = data;
		this.naturalidade = naturalidade;
		this.paisQueTorce = paisQueTorce;
		this.email = email;
		this.senha = senha;
		this.pontuacao = new HashMap<Integer, Integer>();
	}
	
	//construtor com foto
	public Jogador (String nome, String data, String naturalidade, String paisQueTorce, String email, String senha, String caminhoFoto) throws IllegalArgumentException {
		
		if (nome == null || data == null || naturalidade == null || paisQueTorce == null || email == null || senha == null || caminhoFoto == null ||
			nome.trim().equals("") ||  data.trim().equals("") || naturalidade.trim().equals("") || paisQueTorce.trim().equals("") || 
			email.trim().equals("") || senha.toString().trim().equals("") || caminhoFoto.toString().trim().equals("")){
			
			throw new IllegalArgumentException();
		}
		
		this.nome = nome;
		this.data = data;
		this.naturalidade = naturalidade;
		this.paisQueTorce = paisQueTorce;
		this.email = email;
		this.senha = senha;
		this.foto = caminhoFoto;
		this.pontuacao = new HashMap<Integer, Integer>();
	}
	
	
	/**
	 * Retorna Nome do Jogador
	 * @return
	 * 		Nome do Jogador
	 */
	public String getNome() {
		return nome;
	}
	
	/**
	 * Modifica Nome do Jogador
	 * @param nome
	 * 		Novo Nome do Jogador
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	/**
	 * Retorna Data de Nascimento do Jogador
	 * @return
	 * 		Data de Nascimento do Jogador
	 */
	public String getData() {
		return data;
	}
	

	/**
	 * Modifica Data de Nascimento do Jogador
	 * @param data
	 * 		Nova Data de Nascimento do Jogador
	 */
	public void setData(String data) {
		this.data = data;
	}
	
	
	
	/**
	 * Retorna Naturalidade do Jogador
	 * @return
	 * 		Local de Nascimento do Jogador
	 */
	public String getNaturalidade() {
		return naturalidade;
	}
	
	/**
	 * Modifica Naturalidade do Jogador
	 * @param naturalidade
	 * 		Nova Naturalidade do Jogador
	 */
	public void setNaturalidade(String naturalidade) {
		this.naturalidade = naturalidade;
	}
	
	/**
	 * Retorna Pais que o Jogador Torce
	 * @return
	 * 		Pais que o Jogador Torce
	 */
	public String getPaisQueTorce() {
		return paisQueTorce;
	}
	
	/**
	 * Retorna Email do Jogador
	 * @return
	 * 		Email do Jogador
	 */
	public String getEmail() {
		return email;
	}
	
	/**
	 * Retorna o caminho da Foto do Jogador
	 * @return
	 * 		Caminho da foto do Jogador
	 */
	public String getFoto(){
		return foto;
	}
	
	/**
	 * Modifica Foto do Jogador
	 * @param novoCaminho
	 * 		Nova Foto do Jogador
	 */
	public void setFoto(String novoCaminho){
		this.foto = novoCaminho;
	}

	/**
	 * Retorna a Pontuacao do Jogador
	 * @return
	 * 		Pontuacao do Jogador
	 */
	public Map<Integer, Integer> getPontuacao() {
		return pontuacao;
	}
	
	/**
	 * Calcula Pontuacao Geral do Bolao
	 * @return
	 * 		Pontuacao Geral do Bolao
	 */
	public int calculaPontuacaoGeral() {
		int pontos = 0;
		for ( int num : pontuacao.values()) {
			pontos += num;
		}
		return pontos;
	}
	
	/**
	 * Calcula a Pontuacao da Rodada
	 * @param identificador
	 * 		Identificacao da Rodada
	 * @return
	 * 		Pontuacao da Rodada
	 */
	public int calculaPontuacaoRodada(int identificador) {
		if (!pontuacao.containsKey(identificador)) {
			return 0;
		} else {
			return pontuacao.get(identificador);
		}
	}
	
	/**
	 * Adiciona pontos ao Jogador
	 * @param num
	 * 		Pontos a ser adicionado ao Jogador
	 */
	public void addPontuacao(int identificador, int num) {
		if (!getPontuacao().containsKey(identificador))
			getPontuacao().put(identificador, num);
		else
			getPontuacao().put(identificador, getPontuacao().get(identificador) + num);

	}
	
	/**
	 * Reinicia a Pontuacao
	 */
	public void resetPontuacao() {
		this.pontuacao = new HashMap<Integer, Integer>();
	}
	
	/**
	 * Retorna a Lista de Grupos do Jogador
	 * @return
	 * 		Lista de Grupos do Jogador
	 */
	public List<Grupo> getGrupos() {
		return grupos;
	}
	
	/**
	 * Adiciona Grupo na lista de Grupos do Jogador
	 * @param grupo
	 * 		Grupo a ser Adicionado
	 */
	public boolean adicionaGrupo(Grupo grupo) throws ExceptionGrupo {
		if (grupo == null)
			throw new ExceptionGrupo("Grupo igual a null.");
		
		if (grupos.size() >= 5){ //Verifica se o Jogador ja participa do limite maximo de grupo
			return false;
		}
		grupos.add(grupo);
		return true;
	}
	
	/**
	 * Remove Grupo na lista de Grupos do Jogador
	 * @param grupo
	 * 		Grupo a ser removido
	 * @return
	 * 		True, se o grupo for removido. False, caso contrario
	 */
	public boolean sairDoGrupo(Grupo grupo) {
		for (Grupo other : getGrupos()) {
			if (other.equals(grupo)) {
				getGrupos().remove(other);
				return true;
			}
		}
		return false;
	}
	
	
	/**
	 * Retorna Senha do Jogador
	 * @return
	 * 		Senha do Jogador
	 */
	public String getSenha() {
		return senha;
	}
	
	/**
	 * Modifica Senha do Jogador
	 * @param senha
	 * 		Nova Senha do Jogador
	 */
	public void setSenha(String senha) {
		this.senha = senha;
	}
	
	/**
	 * Retorna dados sobre o Jogador
	 * @return
	 * 		Informacoes sobre o Jogador
	 */
	public String toString(){
		return "Nome: " + this.nome + "\nData de Nascimento: " + this.data + "\nNaturalidade: " + this.naturalidade 
		+ "\nPais que torce: " + this.paisQueTorce + "\nEmail: " + email;
	}
	
	/**
	 * Verifica a Igualdade entre dois Jogadores. A igualdade sera verdadeira se 2 jogadores tiverem o mesmo email
	 * @return
	 * 		True, caso o 2 Jogadores sejam iguais. False, caso contrario.
	 */
	public boolean equals(Object obj){

		if (!(obj instanceof Jogador)){
			return false;
		}
			
		if (obj == null){
			return false;
		}
			
		Jogador j1 = (Jogador) obj;
		if (!getEmail().equals(j1.getEmail())){
			return false;
		}
			
		return true;	
	}

	@Override
	/**
	 * Compara a Pontuacao de 2 Jogadores
	 */
	public int compareTo(Jogador other) {
		return calculaPontuacaoGeral() - other.calculaPontuacaoGeral();
	}
}
